#include "key.h"

/***********************************************************
*函数名：delay_ms
*函数功能：延时指定毫秒
*函数参数：int n，表示n毫秒
*函数返回值：无
*函数说明：为了避免重复定义，限当前源文件使用。
					 此函数延时不是很精确，后面用定时器代替。
************************************************************/
static void delay_ms(int n)
{
	int i = 168/4*n;
	while(i)
	{
		i--;
	}
}

/***********************************************************
*函数名：Key_Init
*函数功能：对key按键连接的GPIO口进行初始化配置
*函数参数：无
*函数返回值：无
*函数说明：
						KEY1——PA0——通用输入模式，无上拉/下拉
						KEY2——PE2——通用输入模式，无上拉/下拉
						KEY3——PE3——通用输入模式，无上拉/下拉
						KEY4——PE4——通用输入模式，无上拉/下拉
************************************************************/
void Key_Init(void)
{
	/*把A、E组时钟打开*/
	RCC->AHB1ENR |= (1<<0);//打开GPIOA时钟
	RCC->AHB1ENR |= (1<<4);//打开GPIOE时钟

	/*配置GPIO控制器*/
	//模式寄存器——通用输入模式 00
	GPIOA->MODER &= ~(3<<0*2);
	GPIOE->MODER &= ~(3<<2*2 | 3<<3*2 | 3<<4*2);

	//上拉/下拉寄存器——无上下拉	00
	GPIOA->PUPDR &= ~(3<<0*2);
	GPIOE->PUPDR &= ~(3<<2*2 | 3<<3*2 | 3<<4*2);
}


/***********************************************************
*函数名：keyscan
*函数功能：检测key按键按下的情况
*函数参数：无
*函数返回值：u8 key，表示此刻按下了哪一个按键
*函数说明：
						key的取值范围：{0xff,1,2,3,4}
						0xff表示无按键按下
						1表示按下按键1
						2表示按下按键2
						3表示按下按键3
						4表示按下按键4
函数中定义了一个静态变量key_flag（标志位），用来保证
按下一个按键只会在不断循环中返回一次该按键的值，
否则在按下按键的期间此函数会一直返回该按键值，
导致对应的LED灯一直翻转开关状态。
************************************************************/
u8 keyscan(void)
{
	u8 key = 0xff;
	static u8 key_flag = 1;
	if((KEY1||!KEY2||!KEY3||!KEY4) && key_flag)
	{
		delay_ms(15);//延时消抖

		if(KEY1)
		{
			key = 1;
			key_flag = 0;//锁死标志位
		}
		else if(!KEY2)
		{
			key = 2;
			key_flag = 0;
		}
		else if(!KEY3)
		{
			key = 3;
			key_flag = 0;
		}
		else if(!KEY4)
		{
			key = 4;
			key_flag = 0;
		}
	}

	if(!KEY1&&KEY2&&KEY3&&KEY4)
		key_flag = 1;//释放标志位

	return key;
}



